#include "../extend/extend.hpp"
#include "../logs/superlog.h"
#include <unistd.h>

// int main()
// {
//     std::cout << "now: " << superlog::util::Date::now() << std::endl;
//     std::string pathname = "./abc/bcd/a.txt";
//     superlog::util::File::createDirectory(superlog::util::File::path(pathname));
//     return 0;
// }

// int main()
// {
//     std::cout << superlog::LogLevel().toString(superlog::LogLevel::value::DEBUG) << std::endl;
//     std::cout << superlog::LogLevel().toString(superlog::LogLevel::value::INFO) << std::endl;
//     return 0;
// }

/*日志落地模块测试*/
// int main()
// {
//     superlog::LogMsg msg(superlog::LogLevel::value::INFO, 53, "main.c", "root", "格式化功能测试...");
//     // superlog::Formatter fmt("abc%%abc[%d{%H:%M:%S] %m%n");
//     superlog::Formatter fmt;
//     std::string str = fmt.format(msg);
//     superlog::LogSink::ptr stdout_lsp = superlog::SinkFactory::create<superlog::StdoutSink>();
//     superlog::LogSink::ptr file_lsp = superlog::SinkFactory::create<superlog::FileSink>("./logfile/test.log");
//     superlog::LogSink::ptr roll_lsp = superlog::SinkFactory::create<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024);
//     stdout_lsp->log(str.c_str(), str.size());
//     file_lsp->log(str.c_str(), str.size());
//     size_t cursize = 0;
//     size_t count = 0;
//     while(cursize < 1024 * 1024 * 10){
//         std::string tmp = str + std::to_string(count++);
//         roll_lsp->log(tmp.c_str(), tmp.size());
//         cursize += tmp.size();
//     }
//     // std::cout << str << std::endl;
//     return 0;
// }

/*日志落地模块扩展测试*/
// int main()
// {
//     superlog::LogMsg msg(superlog::LogLevel::value::INFO, 53, "main.c", "root", "格式化功能测试...");
//     // superlog::Formatter fmt("abc%%abc[%d{%H:%M:%S] %m%n");
//     superlog::Formatter fmt;
//     std::string str = fmt.format(msg);
//     superlog::LogSink::ptr time_lsp = superlog::SinkFactory::create<RollByTime>("./logfile/roll-", TimeGap::GAP_SECOND);
//     time_t old = superlog::util::Date::now();
//     // 写入5秒钟的数据
//     while(superlog::util::Date::now() < old + 5){
//         time_lsp->log(str.c_str(), str.size());
//         usleep(1000);
//     }
//     return 0;
// }

/*同步日志器功能测试*/
// int main()
// {
//     std::string logger_name = "sync_logger";
//     superlog::LogLevel::value limit = superlog::LogLevel::value::WARN;
//     superlog::Formatter::ptr fmt(new superlog::Formatter());
//     superlog::LogSink::ptr stdout_lsp = superlog::SinkFactory::create<superlog::StdoutSink>();
//     superlog::LogSink::ptr file_lsp = superlog::SinkFactory::create<superlog::FileSink>("./logfile/test.log");
//     superlog::LogSink::ptr roll_lsp = superlog::SinkFactory::create<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024);
//     std::vector<superlog::LogSink::ptr> sinks = {stdout_lsp, file_lsp, roll_lsp};

//     superlog::Logger::ptr logger(new superlog::SyncLogger(logger_name, limit, fmt, sinks));

//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");
//     size_t cursize = 0, count = 0;
//     while(cursize < 1024 * 1024 * 10){
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 20;
//     }
//     return 0;
// }

/*日志器建造者测试*/
// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::LocalLoggerBuilder());
//     builder->buildLoggerName("sync_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     // builder->buildFormatter();
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_SYNC);
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/test.log");
//     builder->buildSink<superlog::RollBySizeSink>("./logfile/roll-", 1024*1024);
//     superlog::Logger::ptr logger = builder->build();

//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");
//     size_t cursize = 0, count = 0;
//     while(cursize < 1024 * 1024 * 10){
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//         cursize += 90;
//     }
//     return 0;
// }

// /*读取文件数据，一点一点写入缓冲区，最终将缓冲区数据写入文件，判断生成的新文件和源文件是否一致*/
// int main()
// {
//     std::ifstream ifs("./logfile/test.log", std::ios::binary);
//     if (ifs.is_open() == false) { return -1; }
//     ifs.seekg(0, std::ios::end);    // 读写位置跳转到文件末尾
//     size_t fsize = ifs.tellg();     // 获取当前位置相对于起始位置的偏移量
//     ifs.seekg(0, std::ios::beg);    // 重新跳转到起始位置
    
//     std::string body;
//     body.resize(fsize);
//     ifs.read(&body[0], fsize);
//     if (ifs.good() == false) { std::cout << "read error\n"; return -1; }
//     ifs.close();
    
//     std::cout << fsize << std::endl;
//     superlog::Buffer buffer;
//     for (int i = 0; i < body.size(); i++){
//         buffer.push(&body[i], 1);
//     }
//     std::cout << buffer.readAbleSize() << std::endl;

//     std::ofstream ofs("./logfile/tmp.log", std::ios::binary);
//     size_t rsize = buffer.readAbleSize();
//     for (int i = 0; i < rsize; i++){
//         ofs.write(buffer.begin(), 1);
//         buffer.moveReader(1);
//     }
//     ofs.close();
//     return 0;
// }

/*异步日志器测试*/
// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::LocalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     builder->buildEnableUnsafeAsync();

//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     superlog::Logger::ptr logger = builder->build();

//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");
//     size_t count = 0;
//     while(count < 500000){
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//     }
//     return 0;
// }

/*测试全局单例管理器*/
// void test()
// {
//     superlog::Logger::ptr logger = superlog::LoggerManager::getInstance().getLogger("async_logger");
//     logger->debug(__FILE__, __LINE__, "%s", "测试日志");
//     logger->info(__FILE__, __LINE__, "%s", "测试日志");
//     logger->warn(__FILE__, __LINE__, "%s", "测试日志");
//     logger->error(__FILE__, __LINE__, "%s", "测试日志");
//     logger->fatal(__FILE__, __LINE__, "%s", "测试日志");
//     size_t count = 0;
//     while(count < 500000){
//         logger->fatal(__FILE__, __LINE__, "测试日志-%d", count++);
//     }
// }

// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     // builder->buildEnableUnsafeAsync();
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     builder->build();

//     test();

//     return 0;
// }

/*宏函数测试*/
// void test()
// {
//     superlog::Logger::ptr logger = superlog::LoggerManager::getInstance().getLogger("async_logger");
//     // logger->debug("%s", "测试日志");
//     // logger->info("%s", "测试日志");
//     // logger->warn("%s", "测试日志");
//     // logger->error("%s", "测试日志");
//     // logger->fatal("%s", "测试日志");
//     DEBUG("%s", "测试日志");
//     INFO("%s", "测试日志");
//     WARN("%s", "测试日志");
//     ERROR("%s", "测试日志");
//     FATAL("%s", "测试日志");

//     size_t count = 0;
//     while(count < 500000){
//         FATAL("测试日志-%d", count++);
//     }
// }

// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::WARN);
//     builder->buildFormatter("[%c][%f:%l]%m%n");
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     // builder->buildEnableUnsafeAsync();
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     builder->build();

//     test();

//     return 0;
// }


// void test()
// {
//     superlog::Logger::ptr logger = superlog::getLogger("async_logger");
    
//     logger->debug("%s", "test");
//     logger->info("%s", "test");
//     logger->warn("%s", "test");
//     logger->error("%s", "test");
//     logger->fatal("%s", "test");

//     size_t count = 0;
//     while(count < 1000000){
//         logger->fatal("test-%d", count++);
//     }
// }

// int main()
// {
//     std::unique_ptr<superlog::LoggerBuilder> builder(new superlog::GlobalLoggerBuilder());
//     builder->buildLoggerName("async_logger");
//     builder->buildLoggerLevel(superlog::LogLevel::value::DEBUG);
//     builder->buildFormatter("[%c][%f:%l][%p]%m%n");
//     // builder->buildEnableUnsafeAsync();
//     builder->buildLoggerType(superlog::LoggerType::LOGGER_ASYNC);
//     // builder->buildLoggerType(superlog::LoggerType::LOGGER_SYNC);
//     builder->buildSink<superlog::StdoutSink>();
//     builder->buildSink<superlog::FileSink>("./logfile/async.log");
//     builder->buildSink<superlog::RollBySizeSink>("./logfile/roll-async-by-size", 20);
//     superlog::Logger::ptr logger = builder->build();

//     test();
//     return 0;
// }